﻿#实现例如(1)或者(123),(0)括号内为数字，java程序中的规则整为matlab中的由(0)>>[1]
#(1)>>[2]
import re
def string_switch(x):
    with open(x, "r", encoding="utf-8") as f:#打开文件
        #readlines以列表的形式将文件读出
        lines = f.readlines()#读取所有行到内存
 
    with open(x, "w", encoding="utf-8") as f_w:
        for line in lines:
            line=re.sub(r'(?P<value>Math.pow\(.*?\)[\+|\*|/|-|;])',double,line)#匹配之后重新赋值给line
                #.*后面的?号对于实现第一个)很重要，如果不加会识别到最后一个')'
                #'|'的用法不太清楚。但是我却在这里使用成功了。
             #不能换变量，因为没有匹配就返回原字符串line,便于下面的重新写入。                                               
            f_w.write(line)#写入，包含处理过的写入和不必处理的写入。

#多匹配些再处理总比少匹配好。上面就是匹配到Math.exp()+而不是Math.exp()

def double(matched):#double对(1)或者(123)再次提取中间的数字。
    #value=int(re.search('\d+',matched.group('value')).group())
    #return '['+str(value+1)+']'#返回[123+1]或者[1+2]
    yy=matched.group('value')#为了将最后一位保留出来。使用yy[-1]
    yy1=yy[-1]
    value=re.search('\(.*\)',yy).group().strip('(,)')#为了取出小括号内的式子
    return 'power('+value+')'+yy1#将末尾的加减乘除再次加上。


string_switch()



